home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 42 / Amiga Format AFCD42 (Issue 126, Aug 1999).iso / -serious- / programming / other / jikes / src / code.h < prev    next >
C/C++ Source or Header  |  1999-05-14  |  3KB  |  112 lines

  1. // $Id: code.h,v 1.3 1999/01/25 20:00:28 shields Exp $
  2. //
  3. // This software is subject to the terms of the IBM Jikes Compiler
  4. // License Agreement available at the following URL:
  5. // http://www.ibm.com/research/jikes.
  6. // Copyright (C) 1996, 1998, International Business Machines Corporation
  7. // and others.  All Rights Reserved.
  8. // You must accept the terms of that agreement to use this software.
  9. //
  10. #ifndef code_INCLUDED
  11. #define code_INCLUDED
  12.  
  13. #include "config.h"
  14. #include <ctype.h>
  15. #include <assert.h>
  16. #include "bool.h"
  17.  
  18. class Code
  19. {
  20.     //
  21.     // To facilitate the scanning, the character set is partitioned into
  22.     // 8 classes using the array CODE. The classes are described below
  23.     // together with some self-explanatory functions defined on CODE.
  24.     // 
  25.     enum {
  26.              LOG_BASE_SIZE       = 9,
  27.              LOG_COMPLEMENT_SIZE = 7,
  28.              BASE_SIZE           = 512,
  29.              SLOT_SIZE           = 128,
  30.              SLOT_MASK           = 127,
  31.  
  32.              NEWLINE_CODE        = 1, // \n, \r
  33.              SPACE_CODE          = 2, // \t, \v, \f, ' '
  34.              BAD_CODE            = 3, // Everything not covered by other codes ...
  35.              DIGIT_CODE          = 4, // '0'..'9'
  36.              OTHER_DIGIT_CODE    = 5, // all unicode digits other than '0'..'9'
  37.              LOWER_CODE          = 6, // 'a'..'z'
  38.              UPPER_CODE          = 7, // 'A'..'Z'
  39.              OTHER_LETTER_CODE   = 8  // '$', '_', all other unicode Letters
  40.          };
  41.  
  42.     static char code[18048];
  43.     static char *base[512];
  44.  
  45. #ifdef EBCDIC
  46.     static char to_ascii[256];
  47.     static char to_ebcdic[256];
  48. #endif
  49.  
  50. public:
  51.  
  52.     static inline void SetBadCode(wchar_t c)
  53.     {
  54.         base[c >> LOG_COMPLEMENT_SIZE][c] = BAD_CODE;
  55.     }
  56.  
  57.     static inline void CodeCheck(wchar_t c)
  58.     {
  59.          assert(c >> LOG_COMPLEMENT_SIZE < BASE_SIZE);
  60.          assert(base[c >> LOG_COMPLEMENT_SIZE] + c >= (&code[0]));
  61.          assert(base[c >> LOG_COMPLEMENT_SIZE] + c < (&code[18048]));
  62.     }
  63.  
  64.     static inline bool IsNewline(wchar_t c) // \r characters are replaced by \x0a in read_input.
  65.     {
  66.         return c == '\x0a';
  67.     }
  68.  
  69.     static inline bool IsSpaceButNotNewline(wchar_t c)
  70.     {
  71.         return base[c >> LOG_COMPLEMENT_SIZE][c] == SPACE_CODE;
  72.     }
  73.  
  74.     static inline bool IsSpace(wchar_t c)
  75.     {
  76.         return base[c >> LOG_COMPLEMENT_SIZE][c] <= SPACE_CODE;
  77.     }
  78.  
  79.     static inline bool IsDigit(wchar_t c)
  80.     {
  81.         return base[c >> LOG_COMPLEMENT_SIZE][c] == DIGIT_CODE;
  82.     }
  83.  
  84.     static inline bool IsUpper(wchar_t c)
  85.     {
  86.         return base[c >> LOG_COMPLEMENT_SIZE][c] == UPPER_CODE;
  87.     }
  88.  
  89.     static inline bool IsLower(wchar_t c)
  90.     {
  91.         return base[c >> LOG_COMPLEMENT_SIZE][c] == LOWER_CODE;
  92.     }
  93.  
  94.     static inline bool IsAlpha(wchar_t c)
  95.     {
  96.         return base[c >> LOG_COMPLEMENT_SIZE][c] >= LOWER_CODE;
  97.     }
  98.  
  99.     static inline bool IsAlnum(wchar_t c)
  100.     {
  101.         return base[c >> LOG_COMPLEMENT_SIZE][c] >= DIGIT_CODE;
  102.     }
  103.  
  104. #ifdef EBCDIC
  105.     static inline char ToASCII(char c)         { return to_ascii[c]; }
  106.     static inline char ToEBCDIC(char c)        { return to_ebcdic[c]; }
  107. #endif
  108.  
  109. };
  110.  
  111. #endif
  112.